<?php
declare (strict_types = 1);

namespace App\Utils\Services;

use Hyperf\Contract\LengthAwarePaginatorInterface;

interface ServicesInterface {

    /**
     * 分页
     * @param int $perPage
     * @param string[] $columns
     * @param string $pageName
     * @param null $page
     * @return LengthAwarePaginatorInterface|\Hyperf\Database\Model\Collection|static[]
     */
    public function paginate($data, $argument);

    /**
     * Collection
     * @param array $columns
     * @return mixed
     */
    public function get($columns = []);

    /**
     * 查询单条数据
     * @param array $columns
     * @return mixed
     */
    public function first($columns = [], bool $throw=false);

    /**
     * 根据主键查询数据
     * @param $id
     * @param array $columns
     * @param bool $throw
     * @return mixed
     */
    public function find($id, $columns = [], bool $throw=false);

    /**
     * 获取列
     * @param $column
     * @param null $key
     * @return mixed
     */
    public function pluck($column, $key = null);

    /**
     * 分块查询
     * @param $count
     * @param $callback
     * @return mixed
     */
    public function chunk($count, $callback);

    /**
     * 获取值
     * @param $column
     * @return mixed
     */
    public function value($column);

    /**
     * 游标查询
     * @return mixed
     */
    public function cursor();

    /**
     * 统计
     * @param string $columns
     * @return mixed
     */
    public function count($columns = '*');

    /**
     * 获取最大值
     * @param $column
     * @return mixed
     */
    public function max($column);

    /**
     * 获取最大值
     * @param $column
     * @return mixed
     */
    public function min($column);

    /**
     * 平均值
     * @param $column
     * @return mixed
     */
    public function avg($column);

    /**
     * 总数
     * @param $column
     * @return mixed
     */
    public function sum($column);

    /**
     * 新增/编辑
     * @param array $options
     * @return bool
     */
    public function save(array $options = []):bool;

    /**
     * 插入
     * @param array $attributes
     * @return mixed
     */
    public function create($attributes = []);

    /**
     * 编辑
     * @param array $attributes
     * @param array $options
     * @return mixed
     */
    public function update(array $attributes = [], array $options = []);

    /**
     * 删除
     * @param null $ids
     * @return mixed
     */
    public function delete($ids=null);
}